小编典典

自动缩放 TextView 文本以适应边界

all

我正在寻找一种最佳方式来调整包装文本的大小TextView,使其适合其 getHeight 和 getWidth
范围。我不只是在寻找一种包装文本的方法——我想确保它既能包装又足够小以完全适合屏幕。

我在 StackOverflow 上看到了一些需要自动调整大小的案例,但它们要么是非常特殊的情况,有 hack
解决方案,没有解决方案,要么涉及TextView递归地重新绘制直到它足够小(这是内存密集型并强制用户可以在每次递归时逐步缩小文本)。

但我确信有人已经找到了一个很好的解决方案,而不涉及我正在做的事情:编写几个解析和测量文本、调整文本大小并重复直到找到合适的小尺寸的繁重例程。

使用什么例程TextView来换行文本?这些不能以某种方式用于预测文本是否足够小吗?

tl; dr :是否有一种最佳实践方法可以自动调整 a 的大小TextView以适应、包裹在其 getHeight 和 getWidth
范围内?


阅读 203

收藏
2022-02-28

共1个答案

小编典典

从 2018 年 6 月起,Android 正式开始为Android 4.0(API 级别 14)及更高版本 支持此功能。
看看:自动调整 TextViews

使用 Android 8.0(API 级别 26)及更高版本

<?xml version="1.0" encoding="utf-8"?>
<TextView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:autoSizeTextType="uniform"
    android:autoSizeMinTextSize="12sp"
    android:autoSizeMaxTextSize="100sp"
    android:autoSizeStepGranularity="2sp" />

以编程方式:

setAutoSizeTextTypeUniformWithConfiguration(int autoSizeMinTextSize, int autoSizeMaxTextSize, 
        int autoSizeStepGranularity, int unit)

textView.setAutoSizeTextTypeUniformWithConfiguration(
                1, 17, 1, TypedValue.COMPLEX_UNIT_DIP);

Android 8.0(API 级别 26)之前的 Android 版本

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

  <TextView
      android:layout_width="match_parent"
      android:layout_height="200dp"
      app:autoSizeTextType="uniform"
      app:autoSizeMinTextSize="12sp"
      app:autoSizeMaxTextSize="100sp"
      app:autoSizeStepGranularity="2sp" />

</LinearLayout>

以编程方式:

TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(
TextView textView, int autoSizeMinTextSize, int autoSizeMaxTextSize, int autoSizeStepGranularity, int unit)

TextViewCompat.setAutoSizeTextTypeUniformWithConfiguration(textView, 1, 17, 1,
TypedValue.COMPLEX_UNIT_DIP);

注意: TextView 必须有 layout_width=” match_parent ” 或 绝对大小!

2022-02-28